# 144.145.94 二叉树的前序遍历
# 给你二叉树的根节点 root ，返回它节点值的 前序、中序、后序 遍历。
#
# 输入：root = [1,null,2,3]
# 输出：[1,2,3] # 前
# 输出：[1,3,2] # 中
# 输出：[3,2,1] # 后

#
# 输入：root = []
# 输出：[]
#
# 输入：root = [1]
# 输出：[1]

# 确定递归函数的参数和返回值： 确定哪些参数是递归的过程中需要处理的，那么就在递归函数里加上这个参数， 并且还要明确每次递归的返回值是什么进而确
# 定递归函数的返回类型。
#
# 确定终止条件： 写完了递归算法, 运行的时候，经常会遇到栈溢出的错误，就是没写终止条件或者终止条件写的不对，操作系统也是用一个栈的结构来保存每
# 一层递归的信息，如果递归没有终止，操作系统的内存栈必然就会溢出。
#
# 确定单层递归的逻辑： 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right= None


class Solution:
    def preorderTraversal(self, root:TreeNode):# 前序
        res = []
        def traversal(cur):
            if cur == None:
                return None
            res.append(cur.val)
            traversal(cur.left)
            traversal(cur.right)
        traversal(root)
        return res


    def inorderTraversal(self, root): # 中序
        res = []
        def traversal(cur):
            if cur == None:
                return None
            traversal(cur.left)
            res.append(cur.val)
            traversal(cur.right)
        traversal(root)
        return res


    def postorderTraversal(self, root): # 后序
        res = []
        def traversal(cur):
            if cur == None:
                return None
            traversal(cur.left)
            traversal(cur.right)
            res.append(cur.val)
        traversal(root)
        return res

if __name__ == '__main__':
    a = TreeNode(1)
    b = TreeNode(2)
    c = TreeNode(3)
    a.right = b
    b.left = c
    tmp = Solution()
    # res = tmp.preorderTraversal(a)
    # res = tmp.inorderTraversal(a)
    res = tmp.postorderTraversal(a)
    print(res)
